//导入vue对象
import Vue from 'vue'
//导入vuex
import Vuex from 'vuex'
import { Notification } from 'element-ui';
import {getRequest} from "../utils/api";
import '../utils/stomp'
import '../utils/sockjs'

//使用
Vue.use(Vuex)
const now = new Date();
const store = new Vuex.Store({

    state:{
        //这是聊天需要的内容
        sessions:{},
        //把以前的session的值删除掉   以前的数据保存在这个字段中  以前是数组，现在修改成对象
        //数据格式的内容{'zhangsan#lisi':[{}]},
       // currentSessionId: -1,//得到当前用户
        currentSession: null,//不适用id来判断  打算使用name来处理
        currentHr: JSON.parse(window.sessionStorage.getItem("user")),//得到当前的用户信息
        filterKey:'',
        routes:[],//路由数组，从数据库上得到
        stomp: null,//创建聊天用的对象
        isDot: {},//未读提示的内容

    },mutations:{  //state 上边的state  可以不传

        //初始化 hr在login.vue中
        INIT_CURRENTHR(state, hr) {
            state.currentHr = hr;
        },
        //这是聊天需要的内容
        changeCurrentSession (state,currentSession) {
            console.info("mutations   currentSession:"+currentSession);
            Vue.set(state.isDot, state.currentHr.username + '#' + currentSession.username, false);
            state.currentSession = currentSession;

        },
        //接收到usertext发送过来的内容  消息添加
        addMessage(state, msg) {
            console.info("addMessage:"+msg.content);
            let mss = state.sessions[state.currentHr.username + '#' + msg.to];  //拼接发送的格式
            if (!mss) {
                //如果是空的话，把内容设置成空
                // state.sessions[state.currentHr.username+'#'+msg.to] = [];
                //这个是显示本人发的内容 可以在页面上显示
                Vue.set(state.sessions, state.currentHr.username + '#' + msg.to, []);
            }

            //把消息设置一条数据
            state.sessions[state.currentHr.username + '#' + msg.to].push({
                content: msg.content,
                date: new Date(),
                self: !msg.notSelf
            })
        },
        INIT_DATA (state) {
            //浏览器本地的历史聊天记录可以在这里完成   从缓存中得到  缓存是用watch来观察的
            let data = localStorage.getItem('vue-chat-session');
            if (data) {
               state.sessions = JSON.parse(data);
           }

        },
        //初始化数据
        INIT_HR(state, data) {
            console.info("INIT_HR:"+data);
            state.hrs = data;
        },
        // 通过该方法放:
        //  state: 要通过state才可以访问到上面的state变量里面的routes数组
        //  data：传进来的参数  等下去调用只需要传data参数即可
        initRoutes(state,data){
            state.routes = data;
        },
    },actions:{
        //这是聊天需要的内容
        initData (context) {
            context.commit('INIT_DATA')
            //请求后台数据  查询真实数据
            getRequest("/chat/hrs").then(resp => {
                if (resp) {
                    console.info("response:"+resp);
                    context.commit('INIT_HR', resp);
                }
            })
        },
        //一开始就创建websocket链接
        connect(context) {
            context.state.stomp = Stomp.over(new SockJS('/ws/ep'));  //创建stomp对象
            context.state.stomp.connect({}, success => {   //开始发起连接   第一个参数不需要管 第二个参数是 连接成功后的回调  类似ajax 有成功和失败
                console.info("1111");
                context.state.stomp.subscribe('/user/queue/chat', msg => {  //订阅消息   监听地址  回调方法
                    console.info("消息的回调。。。。。。"+msg.body);
                    let receiveMsg = JSON.parse(msg.body);//处理消息内容

                    /****
                    //简单的消息接收
                    receiveMsg.notSelf = true;
                    receiveMsg.to = receiveMsg.from;
                    context.commit('addMessage', receiveMsg);
                     ***/
                    /*****/
                    if (!context.state.currentSession || receiveMsg.from != context.state.currentSession.username) {
                    //说明发消息的人不是现在聊天的人 就进行弹框提示    消息长度长的话，会就行截字处理
                        Notification.info({
                            title: '【' + receiveMsg.fromNickname + '】发来一条消息',
                            message: receiveMsg.content.length > 10 ? receiveMsg.content.substr(0, 10) : receiveMsg.content,
                            position: 'bottom-right'
                        })
                        //未读数据的缓存
                        Vue.set(context.state.isDot, context.state.currentHr.username + '#' + receiveMsg.from, true);
                    }
                    receiveMsg.notSelf = true;
                    receiveMsg.to = receiveMsg.from;
                    context.commit('addMessage', receiveMsg);

                })
            }, error => {

            })
        },
    }

})

//这是聊天需要的内容   监听的是session  如果发生变化的话，会自动的放到localStorage
store.watch(function (state) {
    return state.sessions
},function (val) {
    console.log('CHANGE: ', val);
    localStorage.setItem('vue-chat-session', JSON.stringify(val));
},{
    deep:true/*这个貌似是开启watch监测的判断,官方说明也比较模糊*/
})


export default store;